#include "stc8g.h"
#include "i2c.h"


#define SHT30_ADDR 0x44  // SHT30的I2C地址

static void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++) {
        for(j = 0; j < 1000; j++) {
            _nop_();
        }
    }
}

void SHT30_Init(void)
{
	I2C_Init();
}



// SHT30读取温湿度
bit SHT30_Read(float *temperature, float *humidity) {
    unsigned char buf[6];
    unsigned short temp_raw, humi_raw;
    
    I2C_Start();
    if(!I2C_WriteByte(SHT30_ADDR << 1)) { // SHT30地址 + 写模式
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x2C)) {      // 测量命令高字节
        I2C_Stop();
        return 0;
    }
    if(!I2C_WriteByte(0x06)) {      // 测量命令低字节
        I2C_Stop();
        return 0;
    }
    I2C_Stop();
    
    DelayMs(100); // 等待测量完成
    
    I2C_Start();
    if(!I2C_WriteByte(SHT30_ADDR << 1 | 0x01)) { // SHT30地址 + 读模式
        I2C_Stop();
        return 0;
    }
    buf[0] = I2C_ReadByte(1); // 温度高字节
    buf[1] = I2C_ReadByte(1); // 温度低字节
    buf[2] = I2C_ReadByte(1); // CRC校验(可忽略)
    buf[3] = I2C_ReadByte(1); // 湿度高字节
    buf[4] = I2C_ReadByte(1); // 湿度低字节
    buf[5] = I2C_ReadByte(0); // CRC校验(可忽略)
    I2C_Stop();
    
    temp_raw = (buf[0] << 8) | buf[1];
    humi_raw = (buf[3] << 8) | buf[4];
    
    *temperature = -45 + 175 * (float)temp_raw / 65535;
    *humidity = 100 * (float)humi_raw / 65535;
    return 1;
}